package com.headfirst.singleton.version2;

/**
 * 饱汉式单例模式写法二:
 * 优点：不存在多线程并发访问的安全问题
 * 缺点：存在性能问题,每次访问都要进行线程同步（即 调用synchronized锁)，造成过多的同步开销（加锁 = 耗时、耗能）
 *      实际上只需在第1次调用该方法时才需要同步，一旦单例创建成功后，就没必要进行同步
 */
public class Singleton_2 {
    
    private static Singleton_2 uniqueInstance;
    
    private Singleton_2(){};

    /**
     * 加同步锁，解决多线程安全问题，但是会降低程序的性能
     * @return Singleton_2实例对象
     */
    public static synchronized Singleton_2 getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton_2();
        }
        return uniqueInstance;
    }

    // 写法2 : 该写法的作用与上述写法作用相同，只是写法有所区别
    public static Singleton_2 getInstance_1(){
        // 加入同步锁
        synchronized (Singleton_2.class){
            if(uniqueInstance == null){
                uniqueInstance = new Singleton_2();
            }
            return uniqueInstance;
        }
    }
}
